Coq 在给定列表索引范围的约束条件下,我可以在这里使用析构函数吗?

Coq 在给定列表索引范围的约束条件下,我可以在这里使用析构函数吗?,coq,proof,coq-tactic,formal-verification,Coq,Proof,Coq Tactic,Formal Verification,我试图证明,对于字节列表a,所有字节都是x01从索引2到(n-m-2),其中n是a的长度: (forall (i : nat), ((i >= 2) /\ (i < ((n - m) - 1))) -> ((nth_error a i) = (Some x01))) 因此,在介绍我的范围之后。我有: i : nat i_range : is_true (1 < i) /\ is_true (i < n - m - 1) H : nth_error a ?j =

我试图证明,对于字节列表
a
,所有字节都是
x01
从索引
2
(n-m-2)
,其中
n
a
的长度:

(forall (i : nat), ((i >= 2) /\ (i < ((n - m) - 1))) -> ((nth_error a i) = (Some x01)))
因此,在
介绍我的范围之后。
我有:

i : nat
i_range : is_true (1 < i) /\ is_true (i < n - m - 1)
H : nth_error a ?j =
      nth_error ([x00; x00] ++ repeat x01 (n - m - 2) ++ repeat x00 m)%list  ?j
______________________________________(1/1)
nth_error a i = Some x01
i:nat
i_范围:is_true(1
这是销毁
H
的RHS以消除前两个字节和最后一个
m
字节的正确方法吗?如果是,我如何在
I_范围
方面做到这一点?让我知道我的证明策略是否有缺陷

提前谢谢你的建议

编辑:


最后一个目标的输入错误已修复。首先是
nth\u error buff i=Some x01
,然后我改为
nth\u error a i=Some x01

如果你能确保H以“forall j”开头,那么目标应该是可以证明的。我不确定我是否理解你建议的策略,但我已经将ntherro(前缀++foo++bar)I重写为ntherro-foo(I-2)(使用合适的引理,无论是现有的还是可证明的),然后因为foo是使用repeat定义的,所以将ntherro(repeat baz x01)重写为x01。所有这些引理都有算术方面的条件,应该成立。

结论中的
buff
变量是否与任何其他术语相关?如果没有,目标就无法证明,因为buff没有限制(例如,它可能是空的)。对不起,为了简单起见,我重新命名了things
Buff
实际上是
a
。我来纠正这个问题。谢谢在上下文中有一个存在变量?j似乎是一个潜在的问题。特别是,你需要?j成为i,这似乎范围不广,所以你可能有错误的目标。对于@Blaisorblade:这个存在变量,
?j
,来自于应用我已经证明的另一个定理,即
定理list\u eq\u正确性:forall(l1 l2:list byte),list\u eq l1=true->(forall(j:nat)如果我需要
?j
成为
I
,我可以通过
在H中实例化(1:=I)来实现。
基于这个问题,实例化应该失败,因为evar是在我进入范围之前引入的;如果它奏效,那就更好了。(如果需要,修复方法是稍后应用引理。)引理没有问题,但很遗憾,您没有得到forall语句。(对不起,拼写错误,希望很清楚;我在移动中)。不用担心!那真是帮了大忙。正如你所说的,我使用了两个现有的引理,比如在H中使用
重写n_error_app2。在H中使用siml。在H中使用重写n_error_app1。
来去掉前缀和条。然后,我通过添加
assert(第n个错误重复)删除了foo(elim:forall(I j:nat)(b:byte),jn个错误(重复b I)j=Some b)。承认重写第n个错误\u重复H中的elim。
并通过
应用H来证明我的目标。
最后,我使用
I\u范围
来证明这些重写作为下一个子目标添加的算术边条件。非常感谢,@Blaisorblade!
i : nat
i_range : is_true (1 < i) /\ is_true (i < n - m - 1)
H : nth_error a ?j =
      nth_error ([x00; x00] ++ repeat x01 (n - m - 2) ++ repeat x00 m)%list  ?j
______________________________________(1/1)
nth_error a i = Some x01