我正在尝试用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
答案 0 :(得分:2)
您的After:
基本上是rev (rev l' ++ [n])
(展开rev
),这意味着您希望看到发生的减少已经发生。现在你可能想要证明一个类似于rev (xs ++ ys) = rev ys ++ rev xs
的辅助引理。