Coq 中的 `destruct` 和 `case_eq` 策略有什么区别?

2023-11-26

我明白了destruct因为它将归纳定义分解为其构造函数。我最近看到case_eq我不明白它有什么不同?

1 subgoals
n : nat
k : nat
m : M.t nat
H : match M.find (elt:=nat) n m with
    | Some _ => true
    | None => false
    end = true
______________________________________(1/1)
cc n (M.add k k m) = true

在上述情况下,如果我破坏M.find n m它将 H 分解为真和假,而case_eq (M.find n m)保持 H 不变并添加单独的命题M.find (elt:=nat) n m = Some v,我可以重写它以获得与 destruct 相同的效果。

有人可以解释一下这两种策略之间的区别以及何时应该使用哪一种吗?


家族中的第一个基本战术destruct and case_eq叫做case。这种策略仅修改结论。当您输入时case A and A有一个类型T这是感应式的,系统取代A在目标的结论中通过类型的所有构造函数的实例T,如果需要的话,为这些构造函数的参数添加通用量化。这会创建与类型中的构造函数一样多的目标T。公式A从目标中消失,如果有任何关于A在假设中,该信息与结论中替换它的所有新构造函数之间的联系会丢失。尽管如此,case是一种重要的原始战术。

失去假设中的信息与实例之间的联系A结论是实践中存在很大问题,因此开发者想出了两种解决方案:case_eq and destruct.

就我个人而言,在写 Coq'Art 书时,我建议我们在上面写一个简单的策略case之间保持联系A以及等式形式的各种构造函数实例。这就是现在所谓的战术case_eq。它的作用与case但在目标中添加了额外的蕴涵,其中蕴涵的前提是形式的相等性A = ...以及哪里...是每个构造函数的一个实例。

大约在同一时间,战术destruct被提议。不是限制目标结论中替代的效果,destruct替换所有实例A出现在带有类型构造函数实例的假设中T。从某种意义上说,这更干净,因为它避免了依赖额外的相等概念,但它仍然不完整,因为表达式A可能是复合表达式f B, 而如果B出现在假设中但没有出现f B之间的联系A and B仍然会丢失。

插图

Definition my_pred (n : nat) := match n with 0 => 0 | S p => p end.

Lemma example n :  n <= 1 -> my_pred n <= 0.
Proof.
case_eq (my_pred n).

给出两个目标

------------------
n <= 1 -> my_pred n = 0 -> 0 <= 0

and

------------------
forall p, my_pred n = S p -> n <= 1 -> S p <= 0

额外的等式在这里非常有用。

In 这个问题我建议开发者使用case_eq (a == b) when (a == b)有类型bool因为这种类型是归纳性的并且信息量不大(构造函数没有参数)。但当(a == b)有类型{a = b}+{a <> b}(情况就是这样的string_dec函数)构造函数的参数是有趣属性的证明,并且构造函数参数的额外通用量化足以提供相关信息,在这种情况下a = b在第一个进球和a <> b在第二个进球中。

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

Coq 中的 `destruct` 和 `case_eq` 策略有什么区别? 的相关文章

  • 如何从外部软件调用证明助手Coq

    如何从外部软件调用证明助手Coq Coq 有一些 API 吗 Coq 命令行界面是否足够丰富 可以在文件中传递参数并在文件中接收响应 我对 Java 或 C 桥感兴趣 这是合理的问题 Coq 并不是一种常见的商业软件 人们可以从中获得开发人
  • 当 Coq 中使用自己的可判定性时,评估计算不完整

    The Eval compute命令并不总是计算为简单表达式 考虑代码 Require Import Coq Lists List Require Import Coq Arith Peano dec Import ListNotation
  • Coq 中归纳集的归纳子集

    我有一个用三个构造函数构建的归纳集 Inductive MF Set D MF cn MF gt MF gt MF dn Z gt MF gt MF 我想以某种方式定义一个新的归纳集 B 使得 B 是 MF 的子集 仅包含从 D 和 dn
  • 有没有办法禁用 Coq 中的特定符号?

    我希望在 Coqide 中 证明状态不使用某种符号 但仍使用所有其他符号 这可能吗 据我在文档中的理解 这是不可能的 您也许可以使用打开 关闭范围 但我不确定它是否有效 因为明确指出只要有可能 符号将用于打印
  • 引入先前证明的定理作为假设

    假设我已经在coq中证明了某个定理 稍后我想将其作为假设引入到另一个定理的证明中 有没有一种简洁的方法来做到这一点 当我想做一些诸如案例证明之类的事情时 我通常会出现这种需要 我发现做到这一点的一种方法是assert陈述定理 然后立即证明它
  • 用 Coq 重写假设,保留蕴涵

    我正在做 Coq 证明 我有P gt Q作为假设 并且 P gt Q gt Q gt P 作为引理 如何将假设转化为 Q gt P 当我尝试apply它 我只是产生新的子目标 这没有帮助 换句话说 我想从以下开始 P Prop Q Prop
  • 如何有效地查找 Coq 中定义标识符的位置?

    在大多数 IDE 或文本编辑器中 您可以右键单击某个术语 它会将您带到定义该术语的文件 CoqIDE好像没有这个 所以我一直在做coqdoc myfile v html 然后转到生成的 HTML 文档 但该文件中唯一可点击的术语是针对 Co
  • Coq 中的程序定点和函数有什么区别?

    它们似乎有相似的目的 到目前为止我注意到的一个区别是Program Fixpoint将接受复合措施 例如 measure length l1 length l2 Function似乎拒绝这一点并且只会允许 measure length l1
  • 如何在 Coq 简化过程中应用一次函数?

    据我了解 Coq 中的函数调用是不透明的 有时 我需要使用unfold应用它然后fold将函数定义 主体恢复为其名称 这通常很乏味 我的问题是 是否有更简单的方法来应用函数调用的特定实例 作为一个最小的例子 对于一个列表l 证明右附加 没有
  • 在 Coq 中使用依赖类型(安全第 n 个函数)

    我正在尝试学习 Coq 但我发现很难从我读到的内容中实现飞跃软件基础 and 依赖类型的认证编程到我自己的用例 特别是 我想我应该尝试制作一个经过验证的版本nth列表上的函数 我设法写了这个 Require Import Arith Req
  • `Set` 类型的具体示例是什么?`Set` 的含义是什么?

    我一直试图理解什么Set除了在 Adam Chlipala 的书中遇到它之后SO中的这个精彩讨论 https stackoverflow com questions 39601502 what exactly is a set in coq
  • 如何暂时禁用 Coq 中的符号

    当您熟悉项目时 符号很方便 但当您刚刚开始使用代码库时 符号可能会令人困惑 我知道你可以用白话关闭所有符号Set Printing All 但是 我想保留一些打印 例如隐式参数 全部打印如下 Require Import Utf8 core
  • 逻辑:tr_rev_ Correct 的辅助引理

    在逻辑章节中 介绍了反向列表函数的尾递归版本 我们需要证明它可以正确工作 Fixpoint rev append X l1 l2 list X list X match l1 with gt l2 x l1 gt rev append l1
  • 在 Coq 中证明可逆列表是回文

    这是我对回文的归纳定义 Inductive pal X Type list X gt Prop pal0 pal pal1 forall x X pal x pal2 forall x X l list X pal l gt pal x l
  • 如何一步步检查 Coq 中更复杂的策略的作用?

    我试图经历那些著名的和精彩的软件基础书籍 https softwarefoundations cis upenn edu lf current Basics html lab30但我举了一个例子simpl and reflexivity 只
  • Coq 中的“错误:宇宙不一致”是什么意思?

    我正在努力通过软件基础 http www cis upenn edu bcpierce sf current 目前正在做教堂数字的练习 这是自然数的类型签名 Definition nat forall X Type X gt X gt X
  • 可以在 Coq 的蕴涵中使用 destruct 吗?

    destruct可以用来分割and or在柯克 不过好像也可以用暗示 例如我想证明 P gt P Lemma test P P gt P Proof unfold not intro pffpf apply pffpf intro pff
  • 在 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案例分析和函数返回子集类型的重写

    我正在做一个关于使用子集类型编写经过认证的函数的简单练习 想法是先写一个前驱函数 pred forall n n nat n gt 0 m nat S m n 1 然后使用这个定义给定一个函数 pred2 forall n n nat n
  • Coq:多个构造函数的单一表示法

    是否可以在 Coq 中为多个构造函数定义单一符号 如果构造函数的参数类型不同 则可以从中推断出它们 一个最小的 非 工作示例 Inductive A Set a b c C gt A d D gt A with C Set c1 c2 wi

随机推荐

  • Python列表理解-想要避免重复评估

    我有一个列表理解 近似于 f x for x in l if f x 其中 l 是一个列表 f x 是一个返回列表的昂贵函数 我想避免对 f x 的每次非空出现对 f x 求值两次 有什么方法可以将其输出保存在列表理解中吗 我可以删除最终条
  • /usr/lib64/libstdc++.so.6:找不到版本“GLIBCXX_3.4.15”

    我正在尝试运行 appium 测试 但是我收到错误消息 usr lib64 libstdc so 6 version GLIBCXX 3 4 15 not found 我使用的是RedHat6 6 当我跑步时 strings usr lib
  • 如何遍历 HTML 元素中的所有属性?

    我需要 JavaScript 代码来迭代 HTML 元素中填充的属性 This 元素 属性ref 说我可以通过索引访问它 但没有指定它是否得到很好的支持并且可以使用 跨浏览器 或者还有其他方法吗 不使用任何框架 如 jQuery Proto
  • CSS 列数不受尊重

    这里有一个类似的问题 没有真正的答案 CSS 列错误 5 列计数仅显示 4 个 带图像 我在用着column count显示列中的元素 在本例中是一组section元素 但无论使用什么元素 显然 都会发生这种情况 问题是 Chrome 和
  • 是否有通过电子邮件发送每日 C# 提示和技巧的网站? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我订阅了来自 www sq
  • Python BeautifulSoup 提取特定 URL

    是否可以只获取特定的 URL Like a href http www iwashere com washere html next a span class class span a href http www heelo com hel
  • 如何使用 Jackson 和包装对象反序列化/序列化字节数组

    我有以下两个课程 public class User private String name private Secret secret public User JsonProperty name String name JsonPrope
  • 设置 UISwipeGestureRecognizer 的方向

    我想将简单的滑动手势识别添加到我基于视图的 iPhone 项目中 应识别所有方向 右 下 左 上 的手势 UISwipeGestureRecognizer 的文档中指出 您可以通过使用按位或操作数指定多个 UISwipeGestureRec
  • 使用ant-contrib,如何使用endsWith?

    ant contrib 最新版本是ant contrib 1 0b3 jar http ant contrib sourceforge net tasks tasks more conditions html 该文件显示endsWith状况
  • PHP中什么时候不会调用__destruct?

    class MyDestructableClass function construct print nIn constructor n this gt name MyDestructableClass function destruct
  • 如何使用 NEHotspotHelper 获取可用的 WiFi 列表(IOS、objective-c)

    我已经这样做了 1 在Apple开发者页面添加IOS证书 2 在 Apple 开发者页面中添加启用网络扩展的标识符 App ID 3 在 Apple Developer 页面中添加配置文件 4 创建Xcode项目并输入在苹果开发者页面上制作
  • Hibernate:获取太多行

    我在使用 Hibernate 从数据库获取行时遇到问题 当我只想获取一行时 我会收到 20 行 当我想从大约 1 5k 行的表中获取所有行时 我会收到 15 2k 行 该表的实体类具有复合主键 这是我获取所有行的代码 Criteria cr
  • PSR-4 自动加载不起作用

    我创建了一个app modules目录并使用 PSR 4 自动加载它 如下所示 psr 4 Modules app modules 我也做了composer dumpautoload 我有以下目录结构 app modules ModuleN
  • 将消息从存储过程返回到 C# 应用程序

    我有一个添加用户的存储过程 并且在添加的每个权限中 我想开始构建成功消息 我的存储过程运行良好 但如何将该成功消息返回到我的应用程序中的消息对话框中 我想在我的 C 应用程序的消息框中显示以下 text DECLARE text NVARC
  • 我如何找出哪个 GWT 元素具有焦点?

    我想知道 在 GWT 中 哪个元素当前具有焦点 基本上我正在我们的应用程序中开发虚拟键盘 除 tab 键外 所有键都工作正常 如果我获得焦点元素 那么我可以计算出 Tab 键代码 在 javascript 和 jquery 中我们可以使用d
  • 访问前置摄像头。 iPhone/iPod 4

    嘿 我想知道如何访问前置摄像头 也许有一些指南 但我不需要所有按钮等 我只想从面对的相机访问 我不需要按钮来拍照或类似的东西 您可以访问前置摄像头 如下所示 picker cameraDevice UIImagePickerControll
  • 如何从 Laravel 中的作业 ID 获取排队的作业?

    有没有办法从 Laravel 中的作业 ID 获取排队的作业 将作业添加到队列时 我存储作业 ID 稍后在某个时间点 处理队列中的作业有延迟 我想从队列中删除该作业 如果我可以使用作业 ID 获取队列中的作业 我可以使用delete 方法将
  • 如何使用HttpClient发布数据?

    我有this来自 Nuget 的 HttpClient 当我想获取数据时 我这样做 var response await httpClient GetAsync url var data await response Content Rea
  • Twitter Bootstrap 3 navbar-collapse - 设置折叠宽度

    我使用 Twitter Bootstrap 3navbar collapse http bootply com 91119 当您减小页面宽度时 菜单会分成两行 然后折叠 我不分成两行 但想做折叠 我该怎么办 您可以减少导航栏折叠的点 Opt
  • Coq 中的 `destruct` 和 `case_eq` 策略有什么区别?

    我明白了destruct因为它将归纳定义分解为其构造函数 我最近看到case eq我不明白它有什么不同 1 subgoals n nat k nat m M t nat H match M find elt nat n m with Som