我在 中使用标准向量类型Coq.Vectors
。我想证明关于 的以下属性shiftin
。
Lemma vec_shiftin_eq:
forall A (n:nat) (a0 a1: A) (t0 t1: t A n),
shiftin a0 t0 = shiftin a1 t1 <-> a0 = a1 /\ t0 = t1.
<-
很简单。
-> a0 = a1
没问题。但我对 一无所知-> t0 = t1
。
第 2 部分 (已添加):
编辑:此部分现在作为单独的问题提出:
shiftin、shiftout 和 last
同时,如果向量长度至少为 1,是否有可能证明last
和shiftout
是的有效反转?shiftin
Lemma shiftin_last_shiftout:
forall A (n:nat) (x: t A (S n)),
x = shiftin (last x) (shiftout x).
dependent destruction
您可以使用我正在导入的策略Program
,那么证明就相对容易了。这是我的看法,我能够
inj_pair2
找到Search existT.
:已经有几个答案,但是,所有这些都依赖于额外的公理,特别是这两个:
这些公理是使用时生成的
dependent induction
。但是,这些公理对于证明您的目标并不是必需的。为了在没有公理的情况下证明它,需要更多地了解索引归纳数据类型的理论,特别是如何使用归纳相等并利用身份证明的唯一性。幸运的是,我们实际上不需要这个来证明,因为我们可以Vec
从已经为我们完成繁重工作的库中插入一些引理:这个证明现在是
Closed under the global context
🎉如果您想学习如何使用像 Coq 中的索引归纳数据类型,那么查看、或的
Vec.t
证明可能会有所帮助。如果您还不熟悉该理论,它们可能也难以理解。eta
cons_inj
nil_spec
请注意,使用例如
injection
代替引理cons_inj
是行不通的,因为该策略需要推断上的身份证明的唯一性nat
,而这injection
本身是无法做到的,因为它相当棘手。如果你
Search shiftin
发现cons_inj
引理在你进行依赖归纳时很有用。