Coq:将信息保存在匹配语句中

2023-12-26

我正在构建一个递归函数match在清单上l。在里面cons分支我需要使用以下信息l = cons a l'为了证明递归函数终止。但是,当我使用match l信息丢失。

我该如何使用match保留信息?

这是函数(drop and drop_lemma_le为了便于阅读,在最后给出):

Fixpoint picksome (l:list nat) (H : Acc lt (length l)) {struct H}: list nat.
    refine (
        match l with
            nil => nil
          | cons a l' => cons a (picksome (drop a l') _)
        end
      ).

    apply H.
    assert (l = cons a l') by admit.  (* here is where I need the information *)
    rewrite H0.
    simpl.
    apply le_lt_n_Sm.
    apply drop_lemma_le.
Defined. (* Can't end definition here because of the 'admit'. *)

我实际上可以通过定义整个函数refine如下所示,但它并不真正可读。正在做Print picksome.揭示了 Coq 是如何处理这个问题的,但它也很长并且无法通过嵌套函数等来阅读。

一定有一种更可读的方式来编写它,对吗?

Fixpoint picksome (l:list nat) (H : Acc lt (length l)) {struct H}: list nat.
Proof.
  refine ( _ ).
  remember l as L.
  destruct l as [| a l'].
  apply nil.
  apply (cons a).
  apply (picksome (drop a l')).
  apply H.
  rewrite HeqL.
  simpl.
  apply le_lt_n_Sm.
  apply drop_lemma_le.
Defined.

我的第一次尝试是尝试这样的事情

Definition list_cons_dec {T} (l:list T) :
  {exists a l', l=a::l'} + {~ exists a l', l=a::l'}.
  remember l as L.
  destruct l as [| a l'].
  - right; subst L; intros [a [A B]]; inversion B.
  - left; exists a, l'; apply HeqL.
Defined.

Fixpoint picksome (l:list nat) (H : Acc lt (length l)) {struct H}: list nat.
Proof.
  refine (
      match list_cons_dec l with
        | right Hdec => nil
        | left Hdec => cons _ (picksome (drop _ _) _)
      end
    ).
  destruct l.
  inversion Hdec.  (* fails *)

我无法说出实际情况a and l' that l是由.奶牛抱怨:

Error: Inversion would require case analysis on sort Set which is not allowed
for inductive definition ex.

执行此操作的正确(可读)方法是什么?


以下是以下的定义drop and drop_lemma_le.

Fixpoint drop {T} n (l:list T) :=
  match n with
    | O => l
    | S n' => match l with
                | nil => nil
                | cons _ l' => drop n' l'
              end
  end.

Lemma drop_lemma_le : forall {T} n (l:list T), length (drop n l) <= (length l).
Proof.
  intros; generalize n;
  induction l; intros; destruct n0; try reflexivity.
  apply le_S; apply IHl.
Defined.

要记住您正在进行模式匹配的列表是什么样子,您只需像这样更改匹配的返回类型即可。

Fixpoint picksome (l:list nat) (H : Acc lt (length l)) {struct H}: list nat.
    refine (
        (match l as m return l = m -> list nat with
            nil       => fun Hyp => nil
          | cons a l' => fun Hyp => cons a (picksome (drop a l') _)
        end) (eq_refl l)
      ).

这是什么match l as m return l = m -> list nat是说你正在执行模式匹配l,您将调用匹配的表单m并且,给出一个证明l equals m,您将构建一个 nat 列表。

现在,类型match块会略有不同:而不是仅仅提供一个list nat,它将提供类型的函数l = l -> list nat。对我们来说幸运的是,eq_refl l提供了一个证明l等于它自己,所以我们可以将匹配应用于它并取回我们的初始值list nat.

查看比赛的分支,我们可以看到:

  • In the nil在这种情况下,您可以忽略不需要的额外假设。

  • In the cons在这种情况下,它恰好为您提供了急需的假设,您可以像这样履行证明义务:

    apply H.
    rewrite Hyp.
    simpl.
    apply le_lt_n_Sm.
    apply drop_lemma_le.
    

    Defined.

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

Coq:将信息保存在匹配语句中 的相关文章

  • 如何在C中递归地找到另一个字符串中的字符串位置?

    我们有一个任务来创建带有两个字符串参数的递归函数 原型应该是这样的 int instring char word char sentence 如果我们愿意调用函数 instring Word Another Word 它应该具有以下返回值
  • SQL - 每个级别都有记录的递归树层次结构

    尝试使用 SAS 据我所知 不支持WITH RECURSIVE 在 SQL 中创建经典的层次结构树 这是现有表中的简化数据结构 USER ID SUPERVISOR ID 因此 要构建层次结构 您只需递归连接 x 次即可获取您要查找的数据
  • 从数据库结果生成多维数组的递归函数

    我正在编写一个函数 它接受页面 类别数组 来自平面数据库结果 并根据父 ID 生成嵌套页面 类别项目数组 我想递归地执行此操作 以便可以完成任何级别的嵌套 例如 我在一个查询中获取所有页面 这就是数据库表的样子 id parent id t
  • Python脚本递归重命名文件夹和子文件夹中的所有文件

    您好 我有许多不同的文件需要重命名为其他文件 我已经走到这一步了 但我想要拥有它 这样我就可以有许多要替换的项目及其相应的替换项 而不是逐一输入 运行代码然后再次重新输入 更新 另外 我需要重命名以仅更改文件的一部分而不是整个文件 因此如果
  • 重新安装后使用 pandas dataframes 时出现问题

    我已经重新安装了 Python 和 Anaconda 现在面临以下问题 在我将 pkl 文件加载到数据帧并尝试 查看 该文件后 如下所示 df pd read pickle example pkl df 我收到错误 AttributeErr
  • 最有效地将编译时大小的数组的所有元素相加

    我正在尝试使用最少量的指令 有效地将所有内容添加到编译时大小的数组中 当然 我正在使用模板 我创造了这个 template
  • “auto”如何与双条件(关闭)交互

    我注意到 那auto忽略双条件 这是一个简化的示例 Parameter A B Prop Parameter A iff B A lt gt B Theorem foo1 A gt B Proof intros H apply A iff
  • Coq:承认断言

    有没有办法在 Coq 中承认断言 假设我有一个这样的定理 Theorem test forall m n nat m n n m Proof intros n m assert H1 m m n m S n Admitted Abort 上
  • 变量的多个值介于 0 和数字序言之间

    所以我一直在尝试自学序言 我认为我进展顺利 然而 我有点坚持我正在尝试的这一种方法 toN N A A 等于 0 到 N 1 之间的整数值 按升序生成 所以 toN 5 A 将是 A 0 A 1 A 2 A 3 A 4 我对序言还很陌生 所
  • 递归与迭代算法

    我正在实现欧几里德算法来查找两个整数的 GCD 最大公约数 给出了两个示例实现 递归和迭代 http en wikipedia org wiki Euclidean algorithm Implementations http en wik
  • 如何将嵌套对象数组转换为 CSV?

    我有一个包含嵌套对象的数组 例如 name 1 children name 1 1 children 1 2 id 2 thing name 2 1 children 2 2 name 3 stuff name 3 1 children 3
  • 为什么删除 else 会减慢我的代码速度?

    考虑以下函数 def fact1 n if n lt 2 return 1 else return n fact1 n 1 def fact2 n if n lt 2 return 1 return n fact2 n 1 它们应该是等价的
  • 递归遍历树视图中的节点?

    我有一个树视图 其中已经填充了另一个过程中的文件 文件夹 我想按照从上到下的确切顺序逐项迭代树视图中的项目 但是 与普通列表不同 我不能仅使用简单的for对此的声明 我必须进入每个节点等 我该怎么做呢 我希望有一种方法可以在不运行递归过程的
  • lambda 函数可以递归吗? [复制]

    这个问题在这里已经有答案了 可能的重复 C 0x 中的递归 lambda 函数 https stackoverflow com questions 2067988 recursive lambda functions in c0x 这是一个
  • Haskell:处理死锁的自引用列表

    GHC 允许永久阻止以下内容是否有任何有用的理由 list 1 tail list 看起来列表迭代器 生成器有点复杂 我们应该能够做一些更有用的事情 Return error Infinitely blocking list Return
  • MAC-1 汇编递归

    如何在 MAC 1 汇编器中调用递归函数 在 C 中你会做类似的事情 int func int num if num 0 return 1 return num func num 1 我知道如何使用调用函数 CALL 以及如何将参数加载到堆
  • 为什么haskell中的递归列表这么慢?

    我对 Haskell 很陌生 我在 Haskell 中定义了一个函数 febs Integral a gt a gt a febs n n lt 0 0 n 1 1 n 2 1 otherwise febs n 1 febs n 2 但是
  • C语言中的递归是如何工作的?

    我试图了解 C 中递归的工作原理 任何人都可以给我解释控制流吗 include
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • 更好地相当于这个疯狂的嵌套 python for 循环

    for a in map for b in map a for c in map b for d in map c for e in map d print a b c d e 上面的代码用于创建图中一定长度的所有路径 map a 表示从

随机推荐

  • dFdxFine 和 dFdxCoarse 之间的区别

    来自 OpenGL 文档 dFdxFine 和 dFdyFine 使用基于当前片段及其直接邻居的 p 值的局部差分来计算导数 dFdxCoarse 和 dFdyCoarse 使用基于当前片段邻居的 p 值的局部差分来计算导数 并且可能但不一
  • EF6:使用数据库优先方法进行全文搜索

    我找到了这个link http www entityframework info Home FullTextSearch使full text search解决linq 然而 该代码似乎是针对database first approach 如
  • 正则表达式抓取表单标签内容不起作用

    我正在尝试使用 preg match all 获取表单标签内的内容 标签 这是正则表达式
  • 确定 xsl-fo 中的最后一页位置

    我们能否以某种方式确定 XSL FO 中最后一页的位置 如果我只想将页脚放在最后一页 那么该怎么做呢 由于输入数据会变化并且不是静态的 因此 根据数据的不同 可以出现任意数量的页面 希望 还不算太晚 但无论如何 对于所有感兴趣的人 创建页面
  • 为什么 -didselectRowAtIndexPath 没有被调用?

    我创建了一个新项目 Xcode 4 Master Detail 应用程序 只是为了看看我是否做错了什么 但我仍然遇到同样的问题 我想打电话 reloadData当用户取消选择一个单元格 所以这是我的代码 void tableView UIT
  • 企业分发签名 - 谁做的以及为什么?

    作为我们 ISV 公司的一部分 我正在开发一款 iOS 应用程序 我们正在使用 Xamarin iOS 但我希望这对于这个问题来说并不重要 我们的一些将获得该应用程序的客户正在使用 MDM AirWatch 来管理设备并在其设备上安装该应用
  • Ruby:使用字符串插值进行评估

    我不明白 为什么eval工作原理如下 123 456 to s 789 gt 123 456 789 eval 123 456 to s 789 gt 123 我怎样才能插入到一个字符串里面eval Update 谢谢你们 朋友们 有效 所
  • Go语言是否对字符串使用写时复制[重复]

    这个问题在这里已经有答案了 Go语言是否像Java一样对字符串使用写时复制 IE 如果我按值将字符串传递给方法并且从不更改它 则会分配内存并复制字符串 这将是时间效率低下的 或者它只会引用单个副本 它不是写入时复制 因为字符串是不可变的 但
  • Github Gists 语法高亮不起作用

    我正在尝试使用 Markdown 语法突出显示创建一个要点 不幸的是无法在这里发布屏幕截图 然后我按 保存 但没有应用语法突出显示 Python 代码也存在同样的问题 您需要将文件扩展名更改为 md 这是我的叉子gist https gis
  • 使用 Visual Studio 2010 Web Config 转换删除 XML 注释

    我们正在使用 Team Build 来处理对开发服务器的部署 并且需要在转换时从 Web 配置中删除注释 有谁知道如何删除使用转换从 Web 配置文件中注释行 我找到了答案 这似乎是 Visual Studio Team Build 中 X
  • 使用两个校准相机进行 3D 重建 - 该管道中的错误在哪里?

    有很多关于从已知内部校准的立体视图进行 3D 重建的帖子 其中一些是出色的 https stackoverflow com questions 16639106 camera motion from corresponding images
  • 构造正则表达式模式来匹配句子

    我正在尝试编写一种正则表达式模式 该模式将匹配以多个或一个制表符和 或空格开头的任何句子 例如 我希望我的正则表达式模式能够匹配 你好 我喜欢正则表达式 但我正在摸索如何匹配 hello 之后的单词 到目前为止我有这个 String REG
  • 使用 Bokeh 查看 dicom 图像

    我正在尝试将图形背景设置为 dicom 图像 我跟着这个例子 http bokeh pydata org en 0 11 1 docs gallery image rgba html 但是图像数据由dicom pixel array不是RG
  • 我的java代码有一个明显的错误。为什么能编译并运行?

    public class HelloWorld public static void main String args System out println Hello http www google com System out prin
  • 使用 QueryMap 进行改造

    我有一些相同的要求endpoint但参数和返回类型不同 I used QueryMap对于参数但我不知道如何编写返回类型 我必须写 GET xxx Call
  • 如何在jquery中将日期和时间转换为timeago格式

    我正在尝试显示 Facebook 新闻源并在移动网络应用程序上显示它们 它工作正常 但问题是它在移动网络浏览器上不以 timeago 格式 即 2 天前 显示时间 但另一方面它在桌面上正确显示 日期和时间的格式为 2011 09 13T11
  • React Swiper Js 自动播放不会使雨刮器自动滑动

    我在 React 中使用这个滑动器 https swiperjs com react https swiperjs com react 我试图使其 自动播放 但它不会自动滑动 这是我尝试过的 https swiperjs com get s
  • Ruby Http Post 参数

    如何将帖子参数添加到我现在拥有的内容中 toSend nonce gt Time now to i command gt returnCompleteBalances to json uri URI parse https poloniex
  • 通知是什么:资源 id#9? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • Coq:将信息保存在匹配语句中

    我正在构建一个递归函数match在清单上l 在里面cons分支我需要使用以下信息l cons a l 为了证明递归函数终止 但是 当我使用match l信息丢失 我该如何使用match保留信息 这是函数 drop and drop lemm