在归纳的递归步骤中使用“展开”Fixpoint

时间:2017-11-20 23:48:23

标签: coq coq-tactic

我正在尝试用coq来证明某些东西并且同样的问题不断出现; 我想在归纳(非零)的归纳步骤中展开Fixpoint的定义。展开按预期工作,这是一个例子:

在展开列表反向(rev)定义之前:

  n : nat
  l' : natlist
  IHl' : rev (rev l') = l'
  ============================
  rev (rev (n :: l')) = n :: l'

后:

  n : nat
  l' : natlist
  IHl' : rev (rev l') = l'
  ============================
  (fix rev (l : natlist) : natlist := match l with
                                      | [ ] => [ ]
                                      | h :: t => rev t ++ [h]
                                      end)
    ((fix rev (l : natlist) : natlist := match l with
                                         | [ ] => [ ]
                                         | h :: t => rev t ++ [h]
                                         end) l' ++ [n]) = n :: l'

到目前为止一切顺利。现在我希望simpl能够弄清楚我在导入的非零情况,因为n :: l'永远不能为零, 并简化匹配的唯一情况([ ] => [ ]),仅保留定义的非零部分。

不幸的是,它没有隐含地这样做。如何使unfold递归的Fixpoint定义与归纳相匹配?我怎么得到:

  n : nat
  l' : natlist
  IHl' : rev (rev l') = l'
  ============================
  rev (rev l' ++ [n]) = n :: l'

根据内部rev的{​​{1}}定义。

注意:列表的使用与此无关,相同的技术可用于任何归纳定义的类型。

编辑:转化和证明的定义,导致 After 状态。

rev

1 个答案:

答案 0 :(得分:2)

您的After:基本上是rev (rev l' ++ [n])(展开rev),这意味着您希望看到发生的减少已经发生。现在你可能想要证明一个类似于rev (xs ++ ys) = rev ys ++ rev xs的辅助引理。