在归纳的递归步骤中使用 Fixpoint 的 'unfold'

Using 'unfold' of a Fixpoint inside the recursive step of the induction

我试图在 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' 永远不会为零, 并简化匹配的 nil 情况 ([ ] => [ ]),仅保留定义的非 nil 部分。

不幸的是,它并没有隐含地这样做。如何使递归 Fixpoint 定义的 unfold 与归纳相得益彰?我如何获得:

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

根据内部 revrev 定义。

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

编辑: 导致 After 状态的 rev 和证明的定义。

Fixpoint rev (l:natlist) : natlist :=
  match l with
  | nil    => nil
  | h :: t => rev t ++ [h]
  end.

Theorem rev_involutive : forall l : natlist,
  rev (rev l) = l.
Proof.
  intros l. induction l as [| n l'].
  - reflexivity.
  - unfold rev.

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

的辅助引理